import pandas as pd 
import numpy as np
import time
import cx_Oracle
from sqlalchemy import create_engine


#获取配置文件数据
def get_config_data(df_path):
    fill_data = pd.read_csv(df_path)
    if len(fill_data) == 0:
    #如果dfs拉取失败则进行报错
        print('{}均值填充数据拉取失败'.format(df_path))
        return 0 
    else:
        print('{}填充数据拉取成功'.format(df_path))
    return fill_data 


#数据库联接函数                                   
def db_connect(host,port,databases,user,password):    # 传入:1地址 2端口 3数据库 4用户 5密码 返回： 联接引擎
    try: 
        print('开始联接数据库,数据库参数 host:{} port:{} databases:{} user:{} passsword:{}'.format(host,port,databases,user,password))
        dns = cx_Oracle.makedsn(host,port,service_name = databases)
        conn = cx_Oracle.connect(user,password,dns)
        engine = create_engine("oracle://{}:{}".format(user,password+'@')+dns,encoding='utf-8',echo=False)
        print('数据库联接成功')
        return engine,conn
    except Exception as exp:
        print('数据库联接失败')


#oracle专用 
def get_dtyp(df):                #传入1对应的sql 2引擎 3数据名字 返回：df数据
    if len(df) > 0:
        dtyp = {c:types.VARCHAR(df[c].str.len().max()) for c in df.columns[df.dtypes == 'object'].tolist()}
        return dtyp
    else:
        return None


 
#数据读取函数   
def ReadSql(sql,engine,data_name='的'):               #传入：1对应的sql 2引擎 3数据名字  返回：df数据
    df = pd.read_sql(sql,engine)
    if len(df) == 0:
        print('数据错误：没有查询到对应客户{}数据，模型无法计算！'.format(data_name))
        return 
    else:
        print('客户{}数据提数成功'.format(data_name))
        return df
     
#数据写入函数
def ToSql(df,table_name,engine,dtyp=None):                      #传入：1想要保存的数据 2表的名字 3联接引擎 返回： 是否成功
    try:
        data_shape = df.to_sql('{}'.format(table_name),con=engine,if_exists='append',index=False,dtype=dtyp)
        print('数据入库成功，写入{}：'.format(table_name)+str(data_shape)+'条')
        print('成功时间:'+time.strftime('%Y%m%d %H%M%S' ,time.localtime()))
    except Exception as exp:
        print('写入数据库{}失败'.format(table_name))

#数据删除函数                                
def DelSql(table_name,index_id,evalate_id,conn):      # 1传入表的名字  2删除数据的索引 3具体索引 4游标 返回 ： 数据是否删除
    print('开始删除{}表的数据'.format(table_name))
    delsql = '''delete from {} where {} in {}'''.format(table_name,index_id,evalate_id)
    cursor = conn.cursor()
    cursor.execute(delsql)
    conn.commit()
    print('{}'.format(table_name)+'表数据已经删除')


#获取sql语句
def return_sql(index_id,evalate_id):                   #传入索引id 返回sql字典
    sql_dfjch  = ''' SELECT *
                      FROM ESG_RATING
                      WHERE {} IN {} 
    　　　　　　 '''.format(index_id,evalate_id)
    sql_dff = ''' SELECT * 
                   FROM ESG_INDEX_DATA
                   WHERE {} IN {}
              '''.format(index_id,evalate_id)       
    sql_df_w = ''' SELECT * 
                   FROM ESG_FACTOR_WEIGHT
                '''
    sql_df_add_score = ''' SELECT * 
                            FROM ESG_ADD_SCORE                                       
                       ''' 
    sql_fill = ''' SELECT * 
                    FROM ESG_FILL_HJXYPJ '''
    dic_sql = {'sql_dfjch':sql_dfjch,'sql_dff':sql_dff,'sql_df_w':sql_df_w,'sql_df_add_score':sql_df_add_score,'sql_fill':sql_fill}
    return dic_sql


#配置文件动态获取数据库参数
def load_db_params(path):                                                #传入路径
    df = pd.read_csv(path,header=None)                                   #读取配置文件
    df.columns = ['name','param']
    host = df.loc[df.name == 'host','param'].values[0]                   #读出相关参数
    port = df.loc[df.name == 'port','param'].values[0]
    databases = df.loc[df.name == 'databases','param'].values[0]
    user = df.loc[df.name == 'user','param'].values[0]
    password = df.loc[df.name == 'password','param'].values[0]
    return host,port,databases,user,password                             #返回参数
     

